
/*
 * @Author: ljkt
 * @Version: 2.0
 * @Date: 2021-12-01 14:27:01
 * @LastEditors: ljkt
 * @LastEditTime: 2025-01-28 21:06:30
 * @Description:
 */

#include "./Common_Include.h"
#ifdef EN_IOO
Ram s_drv_ioo_t gDrvIoO[e_INDEX_IOO_MAX];
CONST s_ioo_config_t ioo_config_tab[e_INDEX_IOO_MAX] = DRV_IOO_CONFIG_TAB;
void Drv_IoO_Init(void)
{
    unsigned char i;
    s_ioo_config_t *ioo_config = ioo_config_tab;
    memset(&gDrvIoO, 0, sizeof(s_drv_ioo_t));
    for (i = 0; i < ARR_CNT(ioo_config_tab); i++)
    {
        Hal_Gpio_Out(&ioo_config->gpio, ioo_config->level[0]);
        ioo_config++;
    }
}
/**
 * @brief 设置IOO的输出状态
 *
 * @param index IOO的索引
 * @param level 输出电平,REF_TURE或者REF_FALSE
 */
void Drv_IoO_Set(unsigned char index, unsigned char level)
{
    // 获取指定索引的IOO配置
    s_ioo_config_t *ioo_config = &ioo_config_tab[index];
    // 更新IOO的输出状态
    gDrvIoO[index].IoOut = level;
    // 设置GPIO的输出电平
    Hal_Gpio_Set(&ioo_config->gpio, ioo_config->level[level]);
}
/**
 * @brief 扫描并更新IOO的输出状态
 *
 * 该函数会定期扫描IOO的配置表，并根据配置更新IOO的输出状态。
 * 扫描周期由Drv_Autoload_Ntick_u8函数控制。
 */
void Drv_IoO_Scan(void)
{
    // 静态变量tick用于记录扫描周期
    static unsigned char tick = 0;
    unsigned char i;
    // 指向IOO配置表的指针
    s_ioo_config_t *ioo_config = ioo_config_tab;
    // 检查是否达到扫描周期
    if (Drv_Autoload_Ntick_u8(&tick, 100ul))
    {
        // 遍历IOO配置表
        for (i = 0; i < ARR_CNT(ioo_config_tab); i++)
        {
            // 如果IOO使能寄存器为REF_EN_REG
            if (ioo_config->en_reg == REF_EN_REG)
            {
                // 更新GPIO的输出电平
                Hal_Gpio_Set(&ioo_config->gpio, ioo_config->level[gDrvIoO[i].IoOut]);
            }
            // 指向下一个IOO配置
            ioo_config++;
        }
    }
}
#endif
